\subsection{Codigo}

int main()

\hspace{10pt} //Cargamos la mascara de la esfera  \\
\hspace{10pt}	TGA mascara($"../esfera_mask.tga"$);\\
	
\hspace{10pt}	//Cargamos 3 imágenes de las esferas (se pueden cargar otras 3 imágenes de esferas distintas)\\
\hspace{10pt}	TGA img1($"../Imagenes/esfera/esfera\_0.tga"$);\\
\hspace{10pt}	TGA img2($"../Imagenes/esfera/esfera\_1.tga"$);\\
\hspace{10pt}	TGA img3($"../Imagenes/esfera/esfera\_2.tga"$);\\
	
\hspace{10pt}	//1. Calibración\\
\hspace{10pt}	//Calculamos la direccion de iluminacion de cada imagen:\\
				
\hspace{10pt}	//Buscamos los pixeles máximos de cada imagen (p1, p2 y p3):\\
\hspace{10pt}	pair $<$double,double$>$ p1 = img1.getMax();\\
\hspace{10pt}	pair $<$double,double$>$ p2 = img2.getMax();\\
\hspace{10pt}	pair $<$double,double$>$ p3 = img3.getMax(); //cómo se obtienen los máximos? Cómo los buscamos? \\
				
\hspace{10pt}	//Cuando elegimos el punto máximo su normal va a ser igual a (-) la dirección de iluminación.\\
\hspace{10pt}	//Con el punto máximo ya tenemos $S_x y S_y. Falta S_z = - RaizCuadrada (r*r + S_x*S_x + S_y*S-Y)$\\
		
\hspace{10pt}	//Obtenemos el radio:\\
\hspace{10pt}	double radio = mascara.getRadio();\\
		
\hspace{10pt}	pair $<$ int, int $>$ centro = mascara.getCentro(radio);\\
		
\hspace{10pt}	p1.first = p1.first - centro.first;\\
\hspace{10pt}	p2.first = p2.first - centro.first;\\
\hspace{10pt}	p3.first = p3.first - centro.first;\\
		
\hspace{10pt}	p1.second = centro.second - p1.second;\\
\hspace{10pt}	p2.second = centro.second - p2.second;\\
\hspace{10pt}	p3.second = centro.second - p3.second;\\
				
\hspace{10pt}	//Calculamos $S_z$ para cada imagen:\\
\hspace{10pt}	double z1 = - sqrt(radio*radio - p1.first*p1.first - p1.second*p1.second);\\
\hspace{10pt}	double z2 = - sqrt(radio*radio - p2.first*p2.first - p2.second*p2.second);\\
\hspace{10pt}	double z3 = - sqrt(radio*radio - p3.first*p3.first - p3.second*p3.second);\\

\hspace{10pt}	//Tenemos los vectores S (orientaciones distintas de las imágenes - Direccion de iluminación) y los normalizamos:\\
\hspace{10pt}	double normaS1 = sqrt(p1.first*p1.first + p1.second*p1.second + z1*z1);\\
		
\hspace{10pt}	double* s1 = new double[3];\\
\hspace{10pt}	s1[0] = p1.first/normaS1;\\
\hspace{10pt}	s1[1] = p1.second/normaS1;\\
\hspace{10pt}	s1[2] = z1/normaS1; \\
				
\hspace{10pt}	double normaS2 = sqrt(p2.first*p2.first + p2.second*p2.second + z2*z2);\\
\hspace{10pt}	double* s2 = new double[3];\\
\hspace{10pt}	s2[0] = p2.first/normaS2;\\
\hspace{10pt}	s2[1] = p2.second/normaS2;\\
\hspace{10pt}	s2[2] = z2/normaS2;\\
		
\hspace{10pt}	double normaS3 = sqrt(p3.first*p3.first + p3.second*p3.second + z3*z3);\\
\hspace{10pt}	double* s3 = new double[3];\\
\hspace{10pt}	s3[0] = p3.first/normaS3;\\
\hspace{10pt}	s3[1] = p3.second/normaS3;\\
\hspace{10pt}	s3[2] = z3/normaS3;		\\
				
\hspace{10pt}	//2. Construcción Campo Normal\\
\hspace{10pt}	//Como ya tenemos identificados las direcciones de iluminación de cada una de las imágenes (s1, s2 y s3), debemos\\
\hspace{10pt}	//determinar el campo normal m (Ecuación (5)):\\
		
\hspace{10pt}	//Hacemos la matriz de la ecuación (5):\\
\hspace{10pt}	int filas = 3;\\
\hspace{10pt}	int columnas = 3;\\
	
\hspace{10pt}	Matriz L(filas,columnas);\\
\hspace{10pt}	Matriz U(filas,columnas);\\
	
\hspace{10pt}	//Creamos la matriz de los vectores S para la Ecuacion 5:\\
\hspace{10pt}	Matriz matrizS(filas,columnas); \\
		
\hspace{10pt}	//Llenamos la matriz de 3 x 3 con los S	\\
\hspace{10pt}    for(int j=1;j$<$=columnas;j++) { \\
\hspace{10pt}\hspace{10pt}		double valor1 = s1[j];\\
\hspace{10pt}\hspace{10pt}		double valor2 = s2[j];\\
\hspace{10pt}\hspace{10pt}		double valor3 = s3[j];\\
    
\hspace{10pt}\hspace{10pt}        matrizS.setPos(1,j,valor1);            		\\
\hspace{10pt}\hspace{10pt}		matrizS.setPos(2,j,valor2);\\
\hspace{10pt}\hspace{10pt}		matrizS.setPos(3,j,valor3);\\
\hspace{10pt}	}\\
	
\hspace{10pt}	//Obtenemos en L y en U la factorizacion LU de matrix\\
\hspace{10pt}	matrizS.getLU(L,U);\\
\hspace{10pt}	//Tenemos el ancho y alto de las imagenes\\
\hspace{10pt}	int altoImagen = mascara.height;\\
\hspace{10pt}	int anchoImagen = mascara.width;\\

\hspace{10pt}	//Creamos una matriz del tamaño de la imagen donde vamos a poner los resultados de la construccion del campo Normal:\\
\hspace{10pt}	Matriz campoNormalMatriz(altoImagen, anchoImagen, 3);\\
\hspace{10pt}	//En esta matriz en cada coordenada vamos aponer un array de tamaño 3, para guardar en cada uno los 3 m que corresponden\\
\hspace{10pt}	//a cada pixel.\\
	
	
\hspace{10pt}	//Como en L tenemos la composicion L de la matrizS, eso significa que estan los multiplicadores que se utilizaron para triangular la matriz\\
\hspace{10pt}	//Asi que esos multiplicadores lo vamos a usar para saber como queda la matrizS si se hace eliminacion Gaussiana\\
	
\hspace{10pt}	//Las filas son de matrizS:	\\
\hspace{10pt}	//F2 = F2 -  A1.F1 , para poner un 0 en sx2, luego:\\
\hspace{10pt}	//F3 = F3 -  A2.F1 , para poner un 0 en sx3, luego:\\
\hspace{10pt}	//F3 = F3 -  A3.F2 , para poner un 0 en sy3 , nos queda la matrizS triangular inferior. Y podemos resolver el sistema.\\
	
\hspace{10pt}	//Esto lo tenemos que hacer para cada coordenada de las imagenes.\\
	
\hspace{10pt}	//Buscamos los A en la matriz L:\\
\hspace{10pt}	double A1 = L.getId(2,1);\\
\hspace{10pt}	double A2 = L.getId(3,1);\\
\hspace{10pt}	double A3 = L.getId(3,2);\\
		
\hspace{10pt}	//Ahora tenemos que poner sx2, sx3, sy3 en cero y modificar sy2, sz2, sz3, I2 e I3\\
\hspace{10pt}	double sy2 = matrizS.getId(2,2) - matrizS.getId(1,2)*A1; //sy2 = sy2 - sy1.A1\\
\hspace{10pt}	double sz2 = matrizS.getId(2,3) - matrizS.getId(1,3)*A1; //sz2 = sz2 - sz1.A1 \\
\hspace{10pt}	double sz3 = matrizS.getId(3,3) - matrizS.getId(1,3)*A2 - sz2*A3; //sz3 = sz3 - sz1.A2 - sz2.A3\\
	
\hspace{10pt}	//Actualizamos los valores en la matrizS:\\
\hspace{10pt}	matrizS.setPos(2,2,sy2);\\
\hspace{10pt}	matrizS.setPos(2,3,sz2);\\
\hspace{10pt}	matrizS.setPos(3,3,sz3);\\
\hspace{10pt}	matrizS.setPos(2,1,0); //Ponemos 0 para que quede triangular inferior.\\
\hspace{10pt}	matrizS.setPos(3,1,0);\\
\hspace{10pt}	matrizS.setPos(3,2,0);\\

\hspace{10pt}	//Ahora tenemos que ver los I y guardar los m en la matrizCampoNormal:\\
\hspace{10pt}	// (sx1 sy1  sz1)(mx):(I1)\\
\hspace{10pt}	// (0   sy2  sz3)(my):(I2)\\
\hspace{10pt}	// (0    0   sz3)(mz):(I3)\\
	
\hspace{10pt}	// =$>$ mx = (sy1*my + sz1*mz - I1) / sx1\\
\hspace{10pt}	// =$>$ my = (sz3*mz - I2) / sy2\\
\hspace{10pt}	// =$>$ mz = I3 / sz3\\
\hspace{10pt}	double mx;\\
\hspace{10pt}	double my;\\
\hspace{10pt}	double mz;\\
\hspace{10pt}	double* vectorM = new double[3];\\
	
\hspace{10pt}	for(int i = 1; i $<$= altoImagen; i++) {\\
\hspace{10pt}\hspace{10pt} for(int j = 1; j $<$= anchoImagen; j++){\\
\hspace{10pt}\hspace{10pt}\hspace{10pt} double I1 = img1.getPixel(i,j)[0]; //Usamos sólo el canal Red (como va a ser la esfera, tomamos este canal y decimos que\\ \hspace{10pt}\hspace{10pt}\hspace{10pt} esta en escala de grises)\\
\hspace{10pt}\hspace{10pt}\hspace{10pt} double I2 = img2.getPixel(i,j)[0];\\
\hspace{10pt}\hspace{10pt}\hspace{10pt} double I3 = img3.getPixel(i,j)[0];\\
			
\hspace{10pt}\hspace{10pt}\hspace{10pt} //Si sz3, sy2 o matrizS.getId(1,1) es muy chico generan mucho error.\\
\hspace{10pt}\hspace{10pt}\hspace{10pt} mx = I3 / sz3;\\
\hspace{10pt}\hspace{10pt}\hspace{10pt} my = (sz3*mz - I2)/sy2;\\
\hspace{10pt}\hspace{10pt}\hspace{10pt} mz = (matrizS.getId(1,2)*my + matrizS.getId(1,3)*mz - I1) / matrizS.getId(1,1);	\\
			
\hspace{10pt}\hspace{10pt}\hspace{10pt} //Normalizamos los m:\\
\hspace{10pt}\hspace{10pt}\hspace{10pt} double normaM = sqrt(mx*mx+my*my+mz*mz);\\
\hspace{10pt}\hspace{10pt}\hspace{10pt} //Puede ser chica la normaM y generar errores.\\
\hspace{10pt}\hspace{10pt}\hspace{10pt} mx = mx/normaM;\\
\hspace{10pt}\hspace{10pt}\hspace{10pt} my = my/normaM;\\
\hspace{10pt}\hspace{10pt}\hspace{10pt} mz = mz/normaM;\\
			
\hspace{10pt}\hspace{10pt}\hspace{10pt} vectorM[0] = mx;\\
\hspace{10pt}\hspace{10pt}\hspace{10pt} vectorM[1] = my;\\
\hspace{10pt}\hspace{10pt}\hspace{10pt} vectorM[2] = mz;\\
			
\hspace{10pt}\hspace{10pt}\hspace{10pt} //Agregamos el vector a la matriz:\\
\hspace{10pt}\hspace{10pt}\hspace{10pt} campoNormalMatriz.setPosCampoN(i,j,vectorM);	\\
\hspace{10pt}\hspace{10pt} }\\
\hspace{10pt} }\\

\hspace{10pt}	//Finalmente para cada pixel de la imagen tenemos en (x,y) y el vectorM en la matriz campoNormalMatriz.		\\


		
\hspace{10pt} return 0;\\


\input{tga.tex}
